﻿// 103 出栈序列判断.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <deque>
#include <stack>
using  namespace std;
/*
http://oj.daimayuan.top/course/7/problem/55

现在有一个栈，有 n个元素，分别为 1,2,…,n。 
我们可以通过 push 和 pop 操作，将这 n个元素依次放入栈中，
然后从栈中弹出，依次把出栈的元素写下来得到的序列就是出栈序列。

比如 n=3，如果执行 push 1, push 2, pop, push 3, pop, pop，
那么我们 pop 操作得到的元素依次是 2,3,1。也就是说出栈序列就是 2,3,1。

现在给定一个合法的出栈序列，请输出一个合法的由 push 和 pop 操作构成的操作序列。
这里要求 push 操作一定是按 1,2,…,n的顺序。

输入格式
第一行一个整数 n。接下来一行 n个整数，表示出栈序列。

输出格式
输出 2n行，每行一个 push 或 pop 操作，可以证明一个出栈序列对应的操作序列是唯一的。

样例输入1
3
2 3 1
样例输出1
push 1
push 2
pop
push 3
pop
pop
样例输入2
5
1 3 5 4 2
样例输出2
push 1
pop
push 2
push 3
pop
push 4
push 5
pop
pop
pop
数据规模
对于 100%的数据，保证 1≤n≤100000，输入一定是个合法的出栈序列。
*/

int n;
deque<int> arr;
stack<int> st;

int main()
{
	scanf("%d",&n);
	for (int i = 0; i < n; i++) {
		int t; cin >> t;
		arr.push_back(t);
	}

	for (int i = 1; i <= n; i++) {
		while (!st.empty() && st.top() == arr.front()) {
			printf("pop\n");
			st.pop(); arr.pop_front();
		}

		st.push(i); 
		printf("push %d\n",i);
	}
	while (!st.empty()) {
		st.pop();
		printf("pop\n");
	}

	return 0;
}
 